[R] Rでパッケージを必要に応じてインストールする
はじめに
RをRStudio等の開発環境でいじっていて、パッケージのインストール、ライブラリのロードは通常以下の様に記述することと思いますが。
install.package("somepackagename") library(somepackagename)
ローカルで開発しているときには、パッケージのインストール処理を一回行えば、Rインタプリタ上で .libPaths()
と入力して出力される場所にパッケージがインストールされます。1
パッケージはいったんインストールされてしまえば、バージョンが変わったりしなければ長い時間をかけて再インストールする必要はないです。一人で開発している際にはinstall.package
を実行する際にRStudioのアラート等でインストール済みである旨を表すGUIが出るので、その時にインストールしないようにすれば再インストールの時間は省けます。
ですが、多人数の環境で動かす前提のRスクリプトでは話が変わってきます。RScript
コマンドでスクリプトをワンライナーで実行する際には、パッケージがインストールされていない環境のことも考慮する必要があり、「指定パッケージがインストールされていなかったらインストールする」というコードを組む必要があります。
今回はその方法をさらっと紹介します。
コードサンプル
四行のみのコードでいけます
targetPackages <- c('openxlsx', 'PerformanceAnalytics') newPackages <- targetPackages[!(targetPackages %in% installed.packages()[,"Package"])] if(length(newPackages)) install.packages(newPackages, repos = "http://cran.us.r-project.org") for(package in targetPackages) library(package, character.only = T)
- l1 : インストールしたいパッケージ名一覧をベクトル形式で宣言します
- l2 :
installed.packages()
関数でインストールされているパッケージの一覧が取得できるため、インストールしたいパッケージの中でそのなかにないものnewPackages
を抽出します。コマンドで実行した時にはミラーの設定を求められるため、ミラーの参照先としてCRANのサイトを引数に指定します。 - l3 :
newPackages
の中身がひとつでもあったらinstall.packages()
関数でパッケージのインストールを一括で実施します。 - l4 : インストールしたいパッケージ一覧をfor-in文でまわして
library
関数で文字列としてライブラリをロード(character.only = T
)するようにします。
おわりに
分析や集計を行う自前のスクリプトも引き継ぎが前提となると、チーム内の開発環境の前提を考えなくてはならなくなったり、運用しやすいコードを心がけていく必要に迫られます。
今回はその一つとしての開発環境の前提に依存しないパッケージのロードのためのコードの紹介でした。
参考
-
パッケージのインストール場所を変更するときは
.RProfile
にパスを明示的に指定します。.RProfileまわりの公式なドキュメントは Initialization at Start of an R Session にあります。 ↩